package br.com.advocacia.entidade;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "Processo")
public class Processo implements Serializable {
	
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	private Long id;
	
	private Integer sequenciaProcesso;
	private Integer anoProcesso;
	
	@Transient
	private String numeroProcesso;
	
	private String referenciaProcesso;
	private String pasta;
	private String objetoAcao;
	private Double valorCausa;
	private Date dataDistribuicao;
	
	// Se o advogado foi nomeado ou nao 
	private Boolean dativo;
	private Integer andar;
	private String sala;
	
	/** Quando reativar o processo, setar como NULL */
	private Boolean arquivoMorto;
	
/*	
 	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "CLIENTE_ID", nullable = false)
	private Pessoa cliente;
	
 	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "ADVOGADO_ID", nullable = false)
	private Pessoa advogado;
	
 	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "POLO_ATIVO_ID", nullable = false)
	private Pessoa poloAtivo; // Autor
	
 	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "POLO_PASSIVO_ID", nullable = false)
	private Pessoa poloPassivo; // Réu
*/
	
	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "TIPO_ACAO_ID", nullable = false)
	private TipoAcao tipoAcao;

	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "VARA_ID", nullable = false)
	private Vara vara;

	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "COMARCA_ID", nullable = false)
	private Comarca comarca;
	
	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "RITO_ID", nullable = false)
	private Rito rito;
	
	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "FORO_ID", nullable = false)
	private Foro foro;
	
	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "AREA_ID", nullable = false)
	private AreaProcessual areaProcessual;
	
	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "FASE_ID", nullable = false)
	private FaseProcesso faseProcesso;
	
	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "SITUACAO_ID", nullable = false)
	private SituacaoProcesso situacaoProcesso;
	
	@ManyToOne
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name = "INSTANCIA_ID", nullable = false)
	private Instancia instancia;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Integer getSequenciaProcesso() {
		return sequenciaProcesso;
	}

	public void setSequenciaProcesso(Integer sequenciaProcesso) {
		this.sequenciaProcesso = sequenciaProcesso;
	}

	public Integer getAnoProcesso() {
		return anoProcesso;
	}

	public void setAnoProcesso(Integer anoProcesso) {
		this.anoProcesso = anoProcesso;
	}

	public String getNumeroProcesso() {
		return numeroProcesso;
	}

	public void setNumeroProcesso(String numeroProcesso) {
		this.numeroProcesso = numeroProcesso;
	}

	public String getReferenciaProcssso() {
		if (this.sequenciaProcesso != null && anoProcesso != null) {
			return this.sequenciaProcesso + "/"+anoProcesso;
		} else {
			return referenciaProcesso;
		}
	}

	public void setReferenciaProcesso(String referenciaProcesso) {
		this.referenciaProcesso = referenciaProcesso;
	}

	public String getPasta() {
		return pasta;
	}

	public void setPasta(String pasta) {
		this.pasta = pasta;
	}

	public String getObjetoAcao() {
		return objetoAcao;
	}

	public void setObjetoAcao(String objetoAcao) {
		this.objetoAcao = objetoAcao;
	}

	public Double getValorCausa() {
		return valorCausa;
	}

	public void setValorCausa(Double valorCausa) {
		this.valorCausa = valorCausa;
	}

	public Date getDataDistribuicao() {
		return dataDistribuicao;
	}

	public void setDataDistribuicao(Date dataDistribuicao) {
		this.dataDistribuicao = dataDistribuicao;
	}

	public Boolean getDativo() {
		return dativo;
	}

	public void setDativo(Boolean dativo) {
		this.dativo = dativo;
	}

	public Integer getAndar() {
		return andar;
	}

	public void setAndar(Integer andar) {
		this.andar = andar;
	}

	public String getSala() {
		return sala;
	}

	public void setSala(String sala) {
		this.sala = sala;
	}

	public TipoAcao getTipoAcao() {
		return tipoAcao;
	}

	public void setTipoAcao(TipoAcao tipoAcao) {
		this.tipoAcao = tipoAcao;
	}

	public Vara getVara() {
		return vara;
	}

	public void setVara(Vara vara) {
		this.vara = vara;
	}

	public Comarca getComarca() {
		return comarca;
	}

	public void setComarca(Comarca comarca) {
		this.comarca = comarca;
	}

	public Rito getRito() {
		return rito;
	}

	public void setRito(Rito rito) {
		this.rito = rito;
	}

	public Foro getForo() {
		return foro;
	}

	public void setForo(Foro foro) {
		this.foro = foro;
	}

	public AreaProcessual getAreaProcessual() {
		return areaProcessual;
	}

	public void setAreaProcessual(AreaProcessual areaProcessual) {
		this.areaProcessual = areaProcessual;
	}

	public FaseProcesso getFaseProcesso() {
		return faseProcesso;
	}

	public void setFaseProcesso(FaseProcesso faseProcesso) {
		this.faseProcesso = faseProcesso;
	}

	public SituacaoProcesso getSituacaoProcesso() {
		return situacaoProcesso;
	}

	public void setSituacaoProcesso(SituacaoProcesso situacaoProcesso) {
		this.situacaoProcesso = situacaoProcesso;
	}

	public Instancia getInstancia() {
		return instancia;
	}

	public void setInstancia(Instancia instancia) {
		this.instancia = instancia;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((anoProcesso == null) ? 0 : anoProcesso.hashCode());
		result = prime
				* result
				+ ((sequenciaProcesso == null) ? 0 : sequenciaProcesso.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Processo other = (Processo) obj;
		if (anoProcesso == null) {
			if (other.anoProcesso != null)
				return false;
		} else if (!anoProcesso.equals(other.anoProcesso))
			return false;
		if (sequenciaProcesso == null) {
			if (other.sequenciaProcesso != null)
				return false;
		} else if (!sequenciaProcesso.equals(other.sequenciaProcesso))
			return false;
		return true;
	}

	public Boolean getArquivoMorto() {
		return arquivoMorto;
	}

	public void setArquivoMorto(Boolean arquivoMorto) {
		this.arquivoMorto = arquivoMorto;
	}
	

}